近期面试了一些后端程序,问了些优化方面的问题,我发现很多人都答不好这个问题。

先来定义一下,什么样的程序员能称之为务实。对于游戏项目来说,进度是至关重要的一个因素,所以一个务实的程序员,应当能快速解决遇到的问题,快速交付稳定的代码,而可具备一定可以维护性,以应对策划多变的需求。

举个例子,在面试中有个候选人跟我说,他做过一个背包的优化,就是原本是的结构是字典的形式,如{name:”道具1”, lv:1, num:99},为了节省空间,他把这个结构改成数组的形式:[“道具1”, 1, 99],以此减少了冗余的key。然后在外面再封装了api去访问字典的字段。

问题来了,这样的优化真的有必要吗。可能这个优化,对于背包这个系统确实减少了一半的内存。但是,我们需要考虑一个问题是,这个背包系统,在整个玩家数据里,真能占那么大比例吗。假如,背包的数据只占到总内存的2%,那这个优化做完了之后,变成1%,从整体来看,只让内存占用下降了1%,却带来了代码维护上的困难,以及拖慢的项目的进度,这是得不偿失的一件事。

以下是我关于优化的一些观点:

1.在游戏的研发阶段,优化是优先级最低的,我们不应该主动去做优化,开发效率和可维护性是高于优化的,除非某一个功能遇到了瓶颈。

2.我们需要了解客户端和服务器的瓶颈分别是什么:

阅读全文 »

在 Ubuntu 上关闭透明大页(Transparent HugePages, THP)主要有两种方法:临时关闭(重启后失效)和永久关闭。下面我为你详细说明操作步骤,并补充一些注意事项。

透明大页(THP)管理指南

🔧 1. 检查当前 THP 状态

在开始操作前,建议先检查一下当前系统的 THP 状态。打开终端,输入以下命令:

cat /sys/kernel/mm/transparent_hugepage/enabled

如果输出中包含 [always] 或 [madvise],表示 THP 处于启用状态;如果显示 always madvise [never],则表示 THP 已被禁用。

⚡ 2. 临时关闭 THP(重启后失效)

阅读全文 »

最近在配置Nginx转发端口的时候踩了个大坑,记录一下

需求是这样的,我们游戏服务器使用的wss协议,需要用nginx进行大量的端口转发,如wss://xxx.com/10000 转发到 ws://xxx.com:10000,后面的端口范围是10000到11000,我不想写1000条这样的规则,于是我在网上找了这样一段代码:

location ~* ^/(?<port>\d+)$ {
proxy_pass http://127.0.0.1:$port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}

咋一看,好像确实能用,就是把/port替换成:port。之后被同事发现了,惊呼我艹,这特么相当于在公网裸奔。服务器的安全组虽然设置了只对外开放10000到11000端口,但是这段代码,相当于在用户可以通过nginx的80或者443端口,间接访问到任意端口!当服务器的规模还小的时候,一切都正常,但是当用户量上去了,一定会被扫,一旦被扫到一些敏感端口,后果不堪设想。

如何解决这个问题,首先想到的是用if语句,但在Nginx社区中有一个说法”If Is Evil”(if是邪恶的),因为在某些复杂情况下if语句可能导致意外行为。所以我最终采取匹配数字的方式:

location ~* ^/(?<port>(20[0-9]\{3\}))$ {
proxy_pass http://127.0.0.1:$port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}

意思是0到9这一区段数值重复3个,也就是10000-10999的端口能匹配上,这样子其它端口就匹配不上,或者:

阅读全文 »

最近谷歌商店强制要求所有应用在8月31日前更新结算库更新到版本6,我在Unity Package Manager更新IAP到4.12.0,发现打包安卓的时候编译失败。论坛上发现其它人也有一样的问题,Unity官方还未修复此问题,只能退回4.11.0,手动更新Google结算库了。

0.1. IAP退回4.11.0

在Package Manager中回退到4.11.0

0.2. 下载aar

在这里下载billing的aar文件 https://maven.google.com/web/index.html?q=billing#com.android.billingclient:billing:6.2.1

0.3. 替换aar

1.把billing:6.2.1.aar拷贝到Asset目录下,这时候会自动生成同名的meta文件
2.在项目文件夹中搜索billing,找到billing:5.2.1.aar的所在目录(注意,它的同级目录下还有一个同名meta文件),这把两个文件删除,并把billing:6.2.1.aar和billing:6.2.1.aar.meta文件移动到该目录

阅读全文 »

iOS11之后,在Plist中设置LSSupportsOpeningDocumentsInPlace和UIFileSharingEnabled为YES,可以从系统的Files应用中访问应用的Documents目录。

从系统的文件打开,查看我的iPhone,开启了此功能的应用可以从这里面看到这个文件夹,这个文件夹是从应用内部的沙箱目录链接过来的,应用删除后会被随之删除。

1. 细节参考文档

2. 安装依赖

  • Assets -> Google Mobile Ads -> Android -> Resolve
  • Assets -> Google Mobile Ads -> IOS -> cocopads

3. 报错

AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.ads.initialization.OnInitializationCompleteListener

Build Settings > Player Setting > Publishing Settings > Custom Progurard File

阅读全文 »

1. 在linux下部署clash

如何在 Linux 上优雅的使用 Clash?

2. 为 dockerd 设置网络代理

“docker pull” 命令是由 dockerd 守护进程执行。而 dockerd 守护进程是由 systemd 管理。因此,如果需要在执行 “docker pull” 命令时使用 HTTP/HTTPS 代理,需要通过 systemd 配置。

  • 为 dockerd 创建配置文件夹。
    sudo mkdir -p /etc/systemd/system/docker.service.d
  • 为 dockerd 创建 HTTP/HTTPS 网络代理的配置文件,文件路径是 /etc/systemd/system/docker.service.d/http-proxy.conf 。并在该文件中添加相关环境变量。
    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:8080/"
    Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
    Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
  • 刷新配置并重启 docker 服务。
    sudo systemctl daemon-reload
    sudo systemctl restart docker

3. 为 docker 容器设置网络代理

在容器运行阶段,如果需要使用 HTTP/HTTPS 代理,可以通过更改 docker 客户端配置,或者指定环境变量的方式。

阅读全文 »

大家好,今天我给大家分享一个超实用的教程,教你如何从LightShowCreator导出xLights项目,让你的特斯拉灯光秀更加个性化!我们都知道xLights可以自定义非常酷炫的灯光秀,但是操作起来可能有些繁琐。因此,我开发了一款自动生成灯光秀的APP,让你轻松制作特斯拉灯光秀。

不少用户建议我给LightShowCreator添加类似xLights的时间轴来编辑帧,但我深思熟虑后认为,LightShowCreator的宗旨是以娱乐化和简单化为主,添加时间轴可能会让APP变得臃肿,而且在手机上难以实现与xLights一样的精细操作。考虑到这部分用户的需求,我在LightShowCreator中加入了导出xsq文件的功能,完全兼容xLights。

下面是具体的教程:

  1. 在LightShowCreator中,先导入你喜欢的音乐,并使用自动模式或者手动模式生成灯光秀。导出时会得到三个文件:lightshow.wav、lightshow.fseq和lightshow.xsq。将这三个文件拷贝到电脑的同一个文件夹备用。

  2. 打开xLights软件,请务必下载最新版本的xLights和特斯拉开源项目的最新工程文件。目前APP导出的xsq适配的是Apr 27, 2023提交的版本。你可以从此链接下载:https://github.com/teslamotors/light-show/blob/09601c577f838e84320faff8ea3a7266af783f56/xlights/tesla_xlights_show_folder.zip

  3. 在xLights中点击“文件(File)”->“打开序列(Open Sequence)”,选择LightShowCreator导出的lightshow.fseq文件。请务必确保打开的是lightshow.fseq,而不是lightshow.xsq。之后在View下拉菜单选择OldView,你会发现xLights里已经出现了很多自动生成的帧,接下来你可以用xLights进行更加精细的编辑。

如果在导入时遇到问题,请务必注意以下几点:

  1. 将LightShowCreator导出的三个文件放到同一个文件夹中(mp3/wav,fseq和xsq)。
  2. 确保你用的xLights版本是从Github上下载的2023年最新版本(https://github.com/teslamotors/light-show)。使用2021年版本可能会导致不兼容的情况。
  3. 在导入时选择”lightshow.fseq”,而不是”lightshow.xsq”,否则可能会出现警告并丢失数据。

希望这个教程对你有帮助,享受制作特斯拉灯光秀的乐趣吧!如果你还有其他问题或需求,随时联系我,期待你的反馈和精彩灯光秀作品!

阅读全文 »

自定义灯光秀是特斯拉汽车的一项很酷的功能。 LightShowCreator是一款可以快速轻松制作灯光秀的APP。 如果您对它感兴趣,您也可以尝试用它来定制你自己的节目。

1. U盘要求

  • 必须包含一个名为“LightShow”的基本文件夹(解压从该项目下载的 LightShow.zip)
  • 必须格式化为 exFAT、FAT 32(适用于 Windows)、MS-DOS FAT(适用于 Mac)、ext3 或 ext4。 当前不支持 NTFS。
  • 根目录不得包含的 TeslaCam 文件夹。

特斯拉官方指南: https://github.com/teslamotors/light-show

2. 如何创建新项目

阅读全文 »

1. Google Play

1.1. 上传一个带BILLING权限的包

在AndroidMainfest.xml加入

<uses-permission android:name="com.android.vending.BILLING" />

上传APK审核通过后,在Google Play Console 创建商店,或订阅项目

1.2. 安装Unity IAP

Window -> Package Manager -> Unity Registry

阅读全文 »